<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<title>Document</title>


</head>

<body>

	<script type="text/javascript">
		//1.去掉前后所有空格，留下中间空格	
		var arr = "   I am a student   "

		function trim(str) {
			return str.replace(/(^\s*)|(\s*$)/g, '')
			// return str.replace(/(^\s*)|(\s*$)/g, '');
		}
		console.log(trim(arr)) //I am a student
		//2. 字符串中的单词翻转
		var arr1 = "I am a student"

		function reverse(str) {
			return str.split(' ').reverse().join(' ');
			// return str.split(' ').reverse().join(' ')
		}
		console.log(reverse(arr1)) //student a am I
		//3.把字符串中每一个单词的字母翻转
		var arr2 = "hellow world"

		function reverses(str) {

			return str.split("").reverse().join("");
		}
		console.log(reverses(arr2)) //dlrow wolleh


		let pDom = document.createElement('p')
		let cDom = document.createElement('span')

		pDom.innerHTML = `这是一个P标签`
		cDom.innerHTML = `这是一个span标签`
		document.body.appendChild(pDom)
		//4.原生js模拟jq中insertAfter（）方法；在元素的后面插入一个元素;
		function insertAfter(parentDom, childrenDom) {
			parentDom.appendChild(childrenDom)
		}
		// insertAfter()
		insertAfter(pDom, cDom);

		//5.找到一个数组中第二大的数
		var arr3 = [0, 4, 1412, 215, 13224, 514, 515]

		function seach(arr) {
			let num = []
			num = arr.sort(function (a, b) {
				return a - b
			})
			return num[num.length - 2]
		}
		console.log(seach(arr3)) //1412

		//6.封装一个方法 function random(x,y){};要求在x与y之间求出五个随机数，且随机数不能重复
		function random(x, y) {
			let arr = []
			// for (let i = 1; i <= 5; i++) {
			// 	let random = parseInt(Math.random() * (y - x + 1) + x);
			// 	if (arr.indexOf(random) == -1) {
			// 		arr.push(random)
			// 	} else {
			// 		i--
			// 	}
			// }
			// return arr

			for (let i = 0; i < 5; i++) {
				let random = parseInt(Math.random() * y)
				if (arr.indexOf(random) == -1 && random > x) {
					arr.push(random)
				} else {
					i--
				}
			}
			return arr
		}


		console.log(random(7, 15)) //[14, 12, 11, 10, 13]

		//7.封装一个函数，对data中的对象按照id值的大小做升序排列,返回排序后的对象
		var data = [
			{
				id: 5,
				name: "marry",
				email: "marry@sohu.com",
			},
			{
				id: 8,
				name: "kitty",
				email: "kitty@163.com"
			},
			{
				id: 3,
				name: "jack",
				email: "jack@263.com"
			},
			{
				id: 2,
				name: "amy",
				email: "amy@sina.com.cn"
			},
		];

		function sortId(data) {
			return data.sort((a, b) => a.id - b.id)
		}
		console.log(sortId(data)) //[{id: 2, name: "amy", email: "amy@sina.com.cn"},{id: 3, name: "jack", email: "jack@263.com"},{id: 5, name: "marry", email: "marry@sohu.com"},{id: 8, name: "kitty", email: "kitty@163.com"}]

		//8.封装一个方法，把字符串中的关键字替换成“***”
		function retxt(str, now, target) {
			return str.replace(target, now)
		}
		var str = "台湾艺人陈乔恩因酒驾发表道歉声明_国内外最新报道 陈乔恩酒驾的消息一经传出，不到两小时就冲上微博热搜榜第一名，点击率破两百多万，已超过陈学冬与神秘女子恋情曝光的1倍。艺人'陈乔恩'。（图片来源：台湾《旺报》）";
		console.log(retxt(str, '***', '陈乔恩')); //台湾艺人***因酒驾发表道歉声明_国内外最新报道 ***酒驾的消息一经传出，不到两小时就冲上微博热搜榜第一名，点击率破两百多万，已超过陈学冬与神秘女子恋情曝光的1倍。艺人'***'。（图片来源：台湾《旺报》）


		//9.密码验证。要求： 如果输入的密码在数字， 字母、 符号中只出现了一种， 则密码强度为弱， 如果出现了两种， 则密码强度为中， 如果出现了三种， 则密码强度为强；

		var a = prompt("请输入密码");
		function pass(value) {
			let count = 0
			let numExp = /[0-9]/
			let abcExp = /[a-z A-Z]/
			let qweExp = /[!@#$%^&*()_+{}:""''./\>?|]/

			numExp.test(value) && count++
			abcExp.test(value) && count++
			qweExp.test(value) && count++

			switch (count) {
				case 1:
					return '密码等级低'
					break;
				case 2:
					return '密码等级中'
					break;
				case 3:
					return '密码等级高'
					break;
			}

		}
		console.log(pass(a)); //你输入的密码强度-高

		//二、简答题
		//2.给字符串原型上加载1个方法，要求写一个重复打印字符串对象的方法，输入一个整数，这个整数代表重复打印的次数  比如： console.log('hello'.repeatify(3)); 这样会打印出hellohellohello。
		//传统函数方法
		// function repeatify(str, num) {

		// }
		//repeatify('hello ', 3);//hellohellohello

		//原型方法
		String.prototype.repeatify = function (times) {
			let txt = ""
			for (let i = 0; i < times; i++) {
				for (let j = 0; j < this.length; j++) {
					txt += this[j]
				}
			}
			return txt
		}


		console.log('hello '.repeatify(3)) //hellohellohello

		//3. 下面这段代码的输出结果是什么？解释一下你的答案
		function test() {
			console.log(a); //var变量只会将声明的变量提升到最前面赋的值不会提升
			console.log(foo());//function声明的方法可以再任意地方调用并使用
			var a = 1;

			function foo() {
				return 2;
			}
		}
		test();

		//4. 通过下面的代码给出结果， 解释一下你的答案：
		var fullname = 'John Doe';
		var obj = {
			fullname: 'Colin Ihrig',
			prop: {
				fullname: 'Aurelio De Rosa',
				getFullname: function () {
					return this.fullname;
				}
			}
		};
		console.log(obj.prop.getFullname());//对象中声明的方法this指向的是当前对象作用域内的属性

		var test = obj.prop.getFullname;
		console.log(test());//声明的test里面的getFullname只是调用了方法所以this指向的是外面的fullname
		//5.通过使用call() 或apply() 方法使第4题最后一个console.log() 输出的结果为Aurelio De Rosa.
		var fullname = 'John Doe';
		var obj = {
			fullname: 'Colin Ihrig',
			prop: {
				fullname: 'Aurelio De Rosa',
				getFullname: function () {
					return this.fullname;
				}
			}
		};
		// console.log(obj.prop.getFullname());//对象中声明的方法this指向的是当前对象作用域内的属性

		var test = obj.prop.getFullname;
		console.log(test.call(obj.prop));

	</script>
</body>

</html>